from core.function import Function
from core.cuda import cuda_module


class Sigmoid(Function):
    def forward(self, x):
        """
        计算 Sigmoid 操作的前向传播。

        Args:
            x (Variable): 输入变量。

        Returns:
            Variable: Sigmoid 操作的输出变量。
        """
        y = cuda_module.tanh(x * 0.5) * 0.5 + 0.5  # 更好的实现
        return y

    def backward(self, gy):
        """
        计算 Sigmoid 操作的反向传播。

        Args:
            gy (Variable): 输出的梯度。

        Returns:
            Variable: 输入的梯度。
        """
        y = self.outputs[0]()
        gx = gy * y * (1 - y)
        return gx

    def sigmoid(self, x):
        """
        对输入变量应用 Sigmoid 操作。

        Args:
            x (Variable): 输入变量。

        Returns:
            Variable: Sigmoid 操作的输出变量。
        """
        return self(x)
